import store from '@/store'
import uniStarterConfig from '@/uni-starter.config.js'
export default async function() {
	// 登陆选项的判断
	let loginConfig=uniStarterConfig.router.login
	// 清除有配置但设备环境不支持的登陆项
	// #ifdef APP-PLUS
	await new Promise((callBack)=>{
		plus.oauth.getServices(oauthService=>{
			loginConfig=loginConfig.filter(item=>{
				if(["univerify", "weixin", "apple"].includes(item)){
					let index = oauthServices.findIndex(e => e.id == item)
					if(index==-1){
						return false
					}else{
						return oauthService[index].nativeClient
					}
				}else{
					return true
				}
			})
			// 准备预登录环境
			if(loginConfig.includes('univerify')){
				uni.preLogin({
					provider: 'univerify',
					complete: e => {
						console.log(e);
					}
				})
			}
			callBack()
		},err=>{
			console.error('获取服务供应商失败：' + JSON.stringify(err));
		})
	})
	// #endif
	// 非app移除：一键登录、苹果登陆；h5移除微信登陆，如果你做微信公众号登陆需要将此行移除
	// #ifndef APP-PLUS
	loginConfig=loginConfig.filter(item=>{
		return ![
			'univerify',
			'apple',
			// #ifdef H5
			'weixin'
			// #endif
		].includes(item)
	})
	// #endif
	uniStarterConfig.router.login=loginConfig
	// uniStarterConfig挂载到getApp().globalData.config
	setTimeout(()=>{
		getApp({
			allowDefault: true
		}).globalData.config = uniStarterConfig
	},1)
	// 拦截器的封装callFunctionOption
	let callFunctionOption;
	uniCloud.addInterceptor('callFunction',{
		async invoke(option){
			// option为拦截Api的参数 例 {name: 'functionName', data: {'functionParam1': 1, 'functionParam2': 2}}
			// 此处返回错误可终止api执行
			// #ifdef APP-PLUS

			// 判断如果是执行登录，就记录用户的相关设备id(获取匿名设备标识符)
			if(option.name=='uni-id-cf' && (option.data.action== 'register' || option.data.action
				.slice(0,5)=='login')){
				let oaid=await new Promise((callBack,fail)=>{
					if(uni.getSystemInfoSync().platform=='android'){
						plus.device.getOAID({
							success:function(e){
								callBack(e.oaid)
							},
							fail:function(e){
								callBack()
								console.log('error')
							}
						})
					}else{
						callBack()
					}
				})
				// 设备的国际移动设备身份码
				let imei=await new Promise((callBack,fail)=>{
					if(uni.getSystemInfoSync().platform=='android'){
						plus.device.getInfo({
							success:function(e){
								callBack(e.imei)
							},
							fail:function(e){
								callBack()
							}
						})
					}else{
						callBack()
					}
				})
				// 获取客户端clientid(用户推送)
				let push_clientid='',
				//idfa有需要的用户在应用首次启动时自己获取存储到storage中
				    idfa=plus.storage.getItem('idfa')
				try {
					push_clientid=plus.push.getClientInfo().clientid
				}catch(e){
					console.log('获取推送标识失败',e)
				}
				let deviceInfo={
						push_clientid,
						imei,
						oaid,
						idfa
					}
				option.data.DeviceInfo=deviceInfo
			}
			// #endif
			callFunctionOption=option	
		},
		success:(e)=>{
			// res为callFunction的返回值，此处可以对返回值进行修改
			// console.log(e)
			const {
				token,tokenExpired
			}=e.result
			// 将token及过期时间保存在vuex中
			if(token && tokenExpired){
				store.commit('user/login',{
					token,
					tokenExpired
				})
			}
			switch (e.result.code){
				// 非法访问
				case 403:
					uni.navigateTo({
						url:'/pages/login/login'
					})
				break;
				// token失效
				case 30203:
					uni.navigateTo({
						url:'/pages/login/login'
					})
					uni.showToast({
						title:result.msg,
						icon:'none'
					})
				break;
				case 50101:
					uni.showToast({
						title:result.msg,
						icon:'none'
					})
				break;
				default:
				   // console.log('code的值是：' + e.result.code);
				break;
				
			}
			switch (e.result.errCode){
				case 'uni-id-token-not-exist':
					uni.showToast({
						title: '登陆信息失效',
						icon: 'none'
					});
					uni.navigateTo({
						url: "/pages/login/login"
					})
				break;
				default:
					// console.log(e.result.errCode)
				break;
			}
		},
		fail:(e)=>{
			uni.showToast({
				title:'系统错误，请稍后再试',
				icon:'none'
			})
			uni.getNetworkType({
				complete:res=>{
					if(res.networkType=='none'){
						uni.showToast({
							title:'网络异常',
							icon:'none'
						})
						let callBack=res=>{
							if(res.isConnected){
								uni.showToast({
									title:'恢复网络中',
									icon:'none'
								})
								uni.offNetworkStatusChange(function(e){
									console.log('移除网络监听')
								})
								// 恢复联网后重新执行
								uniCloud.callFunction(callFunctionOption)
								uni.offNetworkStatusChange(callBack)
							}
						}
						uni.onNetworkStatusChange(callBack)
					}
				}
			})
		}
	})
	// 自定义的路由拦截
	const {
		"router":{
			needLogin,
			visitor,
			login
		}
	}= uniStarterConfig //需要登陆的页面
	let list=["navigateTo", "redirectTo", "reLaunch", "switchTab"];
	list.forEach(item=>{
		uni.addInterceptor(item,{
			invoke(e) {//调用前拦截
				console.log(e)
				// 获取token
				const token = uni.getStorageSync('uni_id_token'),
				// 判断token是否实现
				tokenExpired=uni.getStorageSync('uni_id_token_expired')<Date.now(),
				// 获取要跳转的页面路径(//获取要前往的页面路径（即url去掉"?"和"?"后的参数）)
				url=e.url.split('?')[0];
				const pages=getCurrentPages(); //页面栈，数组形式
				if(!pages.length){ //说明是首页启动
					return e
				}
				// 当前页面的上一个页面
				const fromUrl = pages[pages.length - 1].route;
				// 判断页面是否是从登录或注册页面过来的
				let inLoginPage = fromUrl.split('/')[1]== 'login' || fromUrl.split('/')[1]== 'register'
				console.log(inLoginPage)
				// 控制登录优先级
				//判断当前窗口是否为登陆页面，如果是则不重定向路由
				if(url=='/pages/login/login' && !inLoginPage){
					console.log('去登陆')
						//一键登录（univerify）、账号（username）、验证码登录（短信smsCode）
					if(login[0]=='username'){
						e.url='/pages/login/login'
					}else{
						if(e.url==url){
							e.url+='?'
						}
						//添加参数之前判断是否带了`？`号如果没有就补上，因为当开发场景本身有参数的情况下是已经带了`？`号
						e.url+="type="+login[0]
					}
				}else{
					// 拦截强制登陆页面
					let pass=true
					if(needLogin){
						// needLogin中item和实际的路由一致，返回false
						pass=needLogin.every(item=>{
							// patter模式
							if(typeof(item)=='object' && item.pattern){
								return !item.pattern.test(url)
							}
							return url!=item
						})
					}
					if(visitor){
						// visitor中的item和实际的路由，如果匹配，则返回ture
						pass = visitor.some((item) => {
							if (typeof(item) == 'object' && item.pattern) {
								return item.pattern.test(url)
							}
							return url == item
						})
					}
					// pass为false且token为空或这token过期，要登录
					if(!pass && (token=='' || tokenExpired)){
						uni.showToast({
							title:'请登录',
							icon:'none'
						})
						uni.navigateTo({
							url:'/pages/login/login'
						})
						return false
					}
				}
				return e
			},
			fail:function(e){
				console.log('err',e)
			}
		})
	})
}



